/* SPDX-FileCopyrightText: © 2022-2024 Decompollaborate */
/* SPDX-License-Identifier: MIT */

/*
    31---------26------------------------------10--------6-5--------0
    |          |                              |function  |   MMI0   |
    ------6----------------------------------------------------6-----
    |---00--|---01--|---10--|---11--| lo
000 |PADDW  | PSUBW | PCGTW | PMAXW |
001 |PADDH  | PSUBH | PCGTH | PMAXH |
010 |PADDB  | PSUBB | PCGTB | ---   |
011 | ---   | ---   | ---   | ---   |
100 |PADDSW |PSUBSW |PEXTLW | PPACW |
101 |PADDSH |PSUBSH |PEXTLH | PPACH |
110 |PADDSB |PSUBSB |PEXTLB | PPACB |
111 | ---   | ---   | PEXT5 | PPAC5 |
 hi |-------|-------|-------|-------|
*/

    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x00, paddw,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel ADD Word
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x01, psubw,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel SUBtract Word
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x02, pcgtw,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel Compare for Greater Than Word
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x03, pmaxw,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel MAXimum Word

    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x04, paddh,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel ADD Halfword
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x05, psubh,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel SUBtract Halfword
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x06, pcgth,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel Compare for Greater Than Halfword
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x07, pmaxh,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel MAXimum Halfword

    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x08, paddb,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel ADD Byte
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x09, psubb,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel SUBtract Byte
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x0A, pcgtb,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel Compare for Greater Than Byte

    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x10, paddsw,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel ADD with Signed saturation Word
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x11, psubsw,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel SUBtract with Signed saturation Word
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x12, pextlw,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel EXTend Lower from Word
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x13, ppacw,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel PACk to Word

    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x14, paddsh,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel ADD with Signed saturation Halfword
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x15, psubsh,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel SUBtract with Signed saturation Halfword
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x16, pextlh,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel EXTend Lower from Halfword
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x17, ppach,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel PACk to Halfword

    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x18, paddsb,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel ADD with Signed saturation Bytes
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x19, psubsb,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel SUBtract with Signed saturation Bytes
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x1A, pextlb,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel EXTend Lower from Bytes
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x1B, ppacb,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRs=true,
        .readsRt=true
    ) // Parallel PACk to Bytes

    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x1E, pext5,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRt=true
    ) // Parallel EXTend from 5-bits
    RABBITIZER_DEF_INSTR_ID(
        r5900, 0x1F, ppac5,
        .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt},
        .modifiesRd=true,
        .readsRt=true
    ) // Parallel PACk to 5-bits
